package com.anolesoft.yr.mbus.sup.controller;

import com.anolesoft.common.core.web.domain.AjaxResult;
import com.anolesoft.yr.mbus.part.dto.PartModelDTO;
import com.anolesoft.yr.mbus.part.vo.PartModelVO;
import com.anolesoft.yr.mbus.sup.dto.SupBaseDTO;
import com.anolesoft.yr.mbus.sup.dto.SupBasePartDTO;
import com.anolesoft.yr.mbus.sup.dto.SupBasePartPriceDTO;
import com.anolesoft.yr.mbus.sup.service.SupBasePartPriceService;
import com.anolesoft.yr.mbus.sup.vo.SupBasePartPriceVO;
import com.anolesoft.yr.mbus.sup.vo.SupBasePartVO;
import com.anolesoft.yr.mbus.sup.vo.SupBaseVO;
import com.anolesoft.yr.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author zhj
 * @date 2020/8/12 10:42
 */
@RestController
public class SupBasePartPriceController {
    @Autowired
    private SupBasePartPriceService supBasePartPriceService;

    @PostMapping(value = "/api/sup/supbasepartprice/add", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult create(SupBasePartPriceVO supBasePartPriceVO) {
        SupBasePartPriceDTO supBasePartPriceDTO = vo2dto(supBasePartPriceVO, true);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.CREATE_SUCCESS_MESSAGE, supBasePartPriceService.create(supBasePartPriceDTO));
    }

    @PutMapping(value = "/api/sup/supbasepartprice/update", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult modify(SupBasePartPriceVO supBasePartPriceVO) {
        SupBasePartPriceDTO supBasePartPriceDTO = vo2dto(supBasePartPriceVO, false);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.MODIFY_SUCCESS_MESSAGE, supBasePartPriceService.modify(supBasePartPriceDTO));
    }

    @DeleteMapping(value = "/api/sup/supbasepartprice/delete/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult remove(@PathVariable("id") String id) {
        return new AjaxResult(HttpStatus.SUCCESS, Constants.DELETE_SUCCESS_MESSAGE, supBasePartPriceService.remove(id));
    }

    @DeleteMapping(value = "/api/sup/supbasepartprice/delete", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult removeBatch(@RequestParam("ids[]") List<String> ids) {
        return new AjaxResult(HttpStatus.SUCCESS, Constants.DELETE_SUCCESS_MESSAGE, supBasePartPriceService.removeBatch(ids));
    }

    @GetMapping(value = "/api/sup/supbasepartprice/get/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectOneById(@PathVariable("id") String id) {
        Optional<SupBasePartPriceDTO> supBasePartPriceDTO = this.supBasePartPriceService.selectOneById(id);
        if (supBasePartPriceDTO.isPresent()) {
            return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, CustomBeanUtils.supBasePartPriceDTO2VO(supBasePartPriceDTO.get()));
        } else {
            return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, null);
        }
    }

    @GetMapping(value = "/api/sup/supbasepartprice/list/all", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectAll() {
        List<SupBasePartPriceVO> vos = supBasePartPriceService.selectAll().stream().map(t -> CustomBeanUtils.supBasePartPriceDTO2VO(t)).collect(Collectors.toList());
        PageInfo<List<SupBasePartPriceVO>> pageInfo = new PageInfo<>(vos.size(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }

    @GetMapping(value = "/api/sup/supbasepartprice/list/all/page", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectPageAll(
            @RequestParam("rows") Integer limit,
            @RequestParam("page") Integer curr) {
        PageData<List<SupBasePartPriceDTO>> pageData = supBasePartPriceService.selectAll(limit, curr);
        List<SupBasePartPriceVO> vos = pageData.getItems().stream().map(t -> CustomBeanUtils.supBasePartPriceDTO2VO(t)).collect(Collectors.toList());
        PageInfo<List<SupBasePartPriceVO>> pageInfo = new PageInfo<>(limit, pageData.getTotal(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }

    @GetMapping(value = "/api/sup/supbasepartprice/list/condition", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectList(SupBasePartPriceVO supBasePartPriceVO) {
        SupBasePartPriceDTO supBasePartPriceDTO = vo2dto(supBasePartPriceVO, false);
        List<SupBasePartPriceVO> vos = supBasePartPriceService.selectList(supBasePartPriceDTO).stream().map(t -> CustomBeanUtils.supBasePartPriceDTO2VO(t)).collect(Collectors.toList());
        PageInfo<List<SupBasePartPriceVO>> pageInfo = new PageInfo<>(vos.size(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }

    @GetMapping(value = "/api/sup/supbasepartprice/list/condition/page", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectListPage(SupBasePartPriceVO supBasePartPriceVO) {
        SupBasePartPriceDTO supBasePartPriceDTO = vo2dto(supBasePartPriceVO, false);
        Integer limit = supBasePartPriceVO.getRows();
        Integer curr = supBasePartPriceVO.getPage();
        PageData<List<SupBasePartPriceDTO>> pageData = supBasePartPriceService.selectList(supBasePartPriceDTO, limit, curr);
        List<SupBasePartPriceVO> vos = pageData.getItems().stream().map(t -> CustomBeanUtils.supBasePartPriceDTO2VO(t)).collect(Collectors.toList());
        PageInfo<List<SupBasePartPriceVO>> pageInfo = new PageInfo<>(limit, pageData.getTotal(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }

    @PostMapping(value = "/api/sup/supbasepartprice/list/condition/union/page", produces = MediaType.APPLICATION_JSON_VALUE)
    public AjaxResult selectPageConditionList(@RequestBody SupBasePartPriceVO supBasePartPriceVO) {
        SupBasePartPriceDTO supBasePartPriceDTO = vo2dto(supBasePartPriceVO, false);

        SupBasePartVO supBasePartVO = supBasePartPriceVO.getSupBasePart();
        if(supBasePartVO!=null){
            SupBasePartDTO supBasePartDTO = SupBasePartDTO.builder().build();

            PartModelVO partModelVO = supBasePartVO.getPartModel();
            SupBaseVO supBaseVO = supBasePartVO.getSupBase();

            if (partModelVO != null) {
                supBasePartDTO.setPartModel(PartModelDTO.builder()
                        .partCode(partModelVO.getPartCode())
                        .partBrand(partModelVO.getPartBrand())
                        .partModel(partModelVO.getPartModel())
                        .partName(partModelVO.getPartName())
                        .partSpecification(partModelVO.getPartSpecification())
                        .partTypeUid(partModelVO.getPartTypeUid())
                        .build());
            }

            if (supBaseVO != null) {
                supBasePartDTO.setSupBase(SupBaseDTO.builder()
                        .supOtherName(supBaseVO.getSupOtherName())
                        .supName(supBaseVO.getSupName())
                        .supCode(supBaseVO.getSupCode())
                        .build());
            }
            supBasePartDTO.setSupBaseUid(supBasePartVO.getSupBaseUid());
            supBasePartDTO.setPartModelUid(supBasePartVO.getPartModelUid());

            supBasePartPriceDTO.setSupBasePart(supBasePartDTO);
        }


        Integer limit = supBasePartPriceVO.getRows();
        Integer curr = supBasePartPriceVO.getPage();
        PageData<List<SupBasePartPriceDTO>> pageData = supBasePartPriceService.selectPageConditionList(supBasePartPriceDTO, limit, curr);
        List<SupBasePartPriceVO> vos = pageData.getItems().stream().map(t -> CustomBeanUtils.supBasePartPriceDTO2VO(t)).collect(Collectors.toList());
        PageInfo<List<SupBasePartPriceVO>> pageInfo = new PageInfo<>(limit, pageData.getTotal(), vos);
        return new AjaxResult(HttpStatus.SUCCESS, Constants.QUERY_SUCCESS_MESSAGE, pageInfo);
    }

//    private SupBasePartPriceVO dto2vo(SupBasePartPriceDTO supBasePartPriceDTO) {
//        return SupBasePartPriceVO.builder()
//                .objuid(supBasePartPriceDTO.getObjuid())
//                .offerPerson(supBasePartPriceDTO.getOfferPerson())
//                .supBasePartUid(supBasePartPriceDTO.getSupBasePartUid())
//                .factoryCode(supBasePartPriceDTO.getFactoryCode())
//                .remark(supBasePartPriceDTO.getRemark())
//                .offerTime(supBasePartPriceDTO.getOfferTime())
//                .offerPrice(supBasePartPriceDTO.getOfferPrice())
//                .modifyUserUid(supBasePartPriceDTO.getModifyUserUid())
//                .modifyTime(supBasePartPriceDTO.getModifyTime())
//                .deleteFlag(supBasePartPriceDTO.getDeleteFlag())
//                .dealPrice(supBasePartPriceDTO.getDealPrice())
//                .createUserUid(supBasePartPriceDTO.getCreateUserUid())
//                .createTime(supBasePartPriceDTO.getCreateTime())
//                .build();
//    }

    private SupBasePartPriceDTO vo2dto(SupBasePartPriceVO supBasePartPriceVO, boolean newId) {
        return SupBasePartPriceDTO.builder()
                .objuid(newId ? CommonUtils.fastUUID() : supBasePartPriceVO.getObjuid())
                .offerPerson(supBasePartPriceVO.getOfferPerson())
                .supBasePartUid(supBasePartPriceVO.getSupBasePartUid())
                .factoryCode(supBasePartPriceVO.getFactoryCode())
                .remark(supBasePartPriceVO.getRemark())
                .offerTime(supBasePartPriceVO.getOfferTime())
                .offerPrice(supBasePartPriceVO.getOfferPrice())
                .modifyUserUid(SecurityUtils.getUserId())
                .modifyTime(supBasePartPriceVO.getModifyTime())
                .deleteFlag(supBasePartPriceVO.getDeleteFlag())
                .dealPrice(supBasePartPriceVO.getDealPrice())
                .createUserUid(SecurityUtils.getUserId())
                .createTime(supBasePartPriceVO.getCreateTime())
                .build();
    }
}
